home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue56 / Alfresco / AALstMon.pas next >
Encoding:
Pascal/Delphi Source File  |  2000-03-02  |  5.8 KB  |  263 lines

  1. {*********************************************************}
  2. {* AALstMon                                              *}
  3. {* Copyright (c) Julian M Bucknall 1998-2000             *}
  4. {* All rights reserved.                                  *}
  5. {*********************************************************}
  6. {* Algorithms Alfresco Threaded list monitor             *}
  7. {*********************************************************}
  8.  
  9. {Note: this unit is released as freeware. In other words, you are free
  10.        to use this unit in your own applications, however I retain all
  11.        copyright to the code. JMB}
  12.  
  13. unit AALstMon;
  14.  
  15. interface
  16.  
  17. uses
  18.   SysUtils,
  19.   Classes,
  20.   AAThread;
  21.  
  22. type
  23.   TaaThreadedList = class
  24.     private
  25.       FList : TList;
  26.       FLock : TaaReadWriteSync;
  27.     protected
  28.       function tlGetItem(aInx : integer) : pointer;
  29.       function tlGetCapacity : integer;
  30.       function tlGetCount : integer;
  31.  
  32.       procedure tlPutItem(aInx : integer; aItem : pointer);
  33.       procedure tlSetCapacity(aNewCapacity : integer);
  34.       procedure tlSetCount(aNewCount : integer);
  35.     public
  36.       constructor Create;
  37.       destructor Destroy; override;
  38.  
  39.       function Add(aItem : pointer) : integer;
  40.       procedure Clear; virtual;
  41.       procedure Delete(aInx : integer);
  42.       procedure Exchange(aInx1, aInx2 : integer);
  43.       function Extract(aItem : pointer) : pointer;
  44.       function First : pointer;
  45.       function IndexOf(aItem : pointer) : integer;
  46.       procedure Insert(aInx : integer; aItem : pointer);
  47.       function Last : pointer;
  48.       procedure Move(aCurInx, aNewInx : integer);
  49.       function Remove(aItem : pointer) : integer;
  50.       property Capacity : integer
  51.                   read tlGetCapacity write tlSetCapacity;
  52.       property Count : integer read tlGetCount write tlSetCount;
  53.       property Items[aInx : integer] : pointer
  54.                   read tlGetItem write tlPutItem; default;
  55.   end;
  56.  
  57. implementation
  58.  
  59. {===TaaThreadedList==================================================}
  60. constructor TaaThreadedList.Create;
  61. begin
  62.   inherited Create;
  63.   FList := TList.Create;
  64.   FLock := TaaReadWriteSync.Create;
  65. end;
  66. {--------}
  67. destructor TaaThreadedList.Destroy;
  68. begin
  69.   FLock.Free;
  70.   FList.Free;
  71.   inherited Destroy;
  72. end;
  73. {--------}
  74. function TaaThreadedList.Add(aItem : pointer) : integer;
  75. begin
  76.   {Add is a writer}
  77.   FLock.StartWriting;
  78.   try
  79.     Result := FList.Add(aItem);
  80.   finally
  81.     FLock.StopWriting;
  82.   end;
  83. end;
  84. {--------}
  85. procedure TaaThreadedList.Clear;
  86. begin
  87.   {Clear is a writer}
  88.   FLock.StartWriting;
  89.   try
  90.     FList.Clear;
  91.   finally                       
  92.     FLock.StopWriting;
  93.   end;
  94. end;
  95. {--------}
  96. procedure TaaThreadedList.Delete(aInx : integer);
  97. begin
  98.   {Delete is a writer}
  99.   FLock.StartWriting;
  100.   try
  101.     FList.Delete(aInx);
  102.   finally
  103.     FLock.StopWriting;
  104.   end;
  105. end;
  106. {--------}
  107. procedure TaaThreadedList.Exchange(aInx1, aInx2 : integer);
  108. begin
  109.   {Exchange is a writer}
  110.   FLock.StartWriting;
  111.   try
  112.     FList.Exchange(aInx1, aInx2);
  113.   finally
  114.     FLock.StopWriting;
  115.   end;
  116. end;
  117. {--------}
  118. function TaaThreadedList.Extract(aItem : pointer) : pointer;
  119. begin
  120.   {Extract is a writer}
  121.   FLock.StartWriting;
  122.   try
  123.     Result := FList.Extract(aItem);
  124.   finally
  125.     FLock.StopWriting;
  126.   end;
  127. end;
  128. {--------}
  129. function TaaThreadedList.First : pointer;
  130. begin
  131.   {First is a reader}
  132.   FLock.StartReading;
  133.   try
  134.     Result := FList.First;
  135.   finally
  136.     FLock.StopReading;
  137.   end;
  138. end;
  139. {--------}
  140. function TaaThreadedList.IndexOf(aItem : pointer) : integer;
  141. begin
  142.   {IndexOf is a reader}
  143.   FLock.StartReading;
  144.   try
  145.     Result := FList.IndexOf(aItem);
  146.   finally
  147.     FLock.StopReading;
  148.   end;
  149. end;
  150. {--------}
  151. procedure TaaThreadedList.Insert(aInx : integer; aItem : pointer);
  152. begin
  153.   {Insert is a writer}
  154.   FLock.StartWriting;
  155.   try
  156.     FList.Insert(aInx, aItem);
  157.   finally
  158.     FLock.StopWriting;
  159.   end;
  160. end;
  161. {--------}
  162. function TaaThreadedList.Last : pointer;
  163. begin
  164.   {Last is a reader}
  165.   FLock.StartReading;
  166.   try
  167.     Result := FList.Last;
  168.   finally
  169.     FLock.StopReading;
  170.   end;
  171. end;
  172. {--------}
  173. procedure TaaThreadedList.Move(aCurInx, aNewInx : integer);
  174. begin
  175.   {Move is a writer}
  176.   FLock.StartWriting;
  177.   try
  178.     FList.Move(aCurInx, aNewInx);
  179.   finally
  180.     FLock.StopWriting;
  181.   end;
  182. end;
  183. {--------}
  184. function TaaThreadedList.Remove(aItem : pointer) : integer;
  185. begin
  186.   {Remove is a writer}
  187.   FLock.StartWriting;
  188.   try
  189.     Result := FList.Remove(aItem);
  190.   finally
  191.     FLock.StopWriting;
  192.   end;
  193. end;
  194. {--------}
  195. function TaaThreadedList.tlGetItem(aInx : integer) : pointer;
  196. begin
  197.   {tlGetItem is a reader}
  198.   FLock.StartReading;
  199.   try
  200.     Result := FList[aInx];
  201.   finally
  202.     FLock.StopReading;
  203.   end;
  204. end;
  205. {--------}
  206. function TaaThreadedList.tlGetCapacity : integer;
  207. begin
  208.   {tlGetCapacity is a reader}
  209.   FLock.StartReading;
  210.   try
  211.     Result := FList.Capacity;
  212.   finally
  213.     FLock.StopReading;
  214.   end;
  215. end;
  216. {--------}
  217. function TaaThreadedList.tlGetCount : integer;
  218. begin
  219.   {tlGetCount is a reader}
  220.   FLock.StartReading;
  221.   try
  222.     Result := FList.Count;
  223.   finally
  224.     FLock.StopReading;
  225.   end;
  226. end;
  227. {--------}
  228. procedure TaaThreadedList.tlPutItem(aInx : integer; aItem : pointer);
  229. begin
  230.   {tlPutItem is a writer}
  231.   FLock.StartWriting;
  232.   try
  233.     FList[aInx] := aItem;
  234.   finally
  235.     FLock.StopWriting;
  236.   end;
  237. end;
  238. {--------}
  239. procedure TaaThreadedList.tlSetCapacity(aNewCapacity : integer);
  240. begin
  241.   {tlSetCapacity is a writer}
  242.   FLock.StartWriting;
  243.   try
  244.     FList.Capacity := aNewCapacity;
  245.   finally
  246.     FLock.StopWriting;
  247.   end;
  248. end;
  249. {--------}
  250. procedure TaaThreadedList.tlSetCount(aNewCount : integer);
  251. begin
  252.   {tlSetCount is a writer}
  253.   FLock.StartWriting;
  254.   try
  255.     FList.Count := aNewCount;
  256.   finally
  257.     FLock.StopWriting;
  258.   end;
  259. end;
  260. {====================================================================}
  261.  
  262. end.
  263.